package com.ht.modules.system.controller;

import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ht.aspect.annotation.AutoLog;
import com.ht.modules.system.entity.ActVariableConfig;
import com.ht.modules.system.entity.ActVariableConfigVo;
import com.ht.entity.LoginUser;
import com.ht.entity.Result;
import com.ht.query.QueryGenerator;
import com.ht.modules.system.service.IActVariableConfigService;
import com.ht.utils.oConvertUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.List;

/**
 *  审批流程变量配置
 */
@Slf4j
@Api(tags="审批流程变量配置")
@RestController
@RequestMapping("/actvariableconfig/actVariableConfig")
public class ActVariableConfigController {

    @Autowired
    private IActVariableConfigService actVariableConfigService;

    /**
     * 流程变量配置分页列表
     * @param actVariableConfigVo 查询条件对象
     * @param pageNo 页码
     * @param pageSize 当页大小
     * @param column 默认排序列
     * @param order 排序方式
     * @return 流程变量配置分页列表
     */
    @ApiOperation(value="审批流程变量配置-流程变量配置分页列表", notes="审批流程变量配置-流程变量配置分页列表")
    @GetMapping(value = "/list")
    public Result<IPage<ActVariableConfigVo>> queryPageList(ActVariableConfigVo actVariableConfigVo,
                                                            @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
                                                            @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
                                                            @RequestParam(name="column",defaultValue="createTime") String column,
                                                            @RequestParam(name="order",defaultValue="desc") String order) {
        Result<IPage<ActVariableConfigVo>> result = new Result<>();
        Page<ActVariableConfigVo> page = new Page<>(pageNo, pageSize);
        page = actVariableConfigService.list(page, actVariableConfigVo, column, order);
        result.success("查询成功！");
        result.setResult(page);
        return result;
    }

    /**
     * 添加
     * @param actVariableConfig 流程变量对象
     */
    @AutoLog(value = "审批流程变量配置-添加")
    @ApiOperation(value="审批流程变量配置-添加", notes="审批流程变量配置-添加")
    @PostMapping(value = "/add")
    public Result<?> add(@RequestBody ActVariableConfig actVariableConfig) {
        Result<?> result = new Result<>();
        try {
            actVariableConfigService.add(actVariableConfig);
            result.success("添加成功！");
        } catch (Exception e) {
            log.error(e.getMessage(),e);
            result.error500("操作失败！" + e.getMessage());
        }
        return result;
    }

    /**
     * 编辑
     * @param actVariableConfig 流程变量对象
     */
    @AutoLog(value = "审批流程变量配置-编辑")
    @ApiOperation(value="审批流程变量配置-编辑", notes="审批流程变量配置-编辑")
    @PutMapping(value = "/edit")
    public Result<?> edit(@RequestBody ActVariableConfig actVariableConfig) {
        Result<?> result = new Result<>();
        try {
            actVariableConfigService.edit(actVariableConfig);
            result.success("修改成功！");
        } catch (Exception e) {
            log.error(e.getMessage(),e);
            result.error500("操作失败！" + e.getMessage());
        }
        return result;
    }

    /**
     * 通过id删除（逻辑删除）
     * @param id 流程变量id
     */
    @AutoLog(value = "审批流程变量配置-通过id删除")
    @ApiOperation(value="审批流程变量配置-通过id删除", notes="审批流程变量配置-通过id删除")
    @DeleteMapping(value = "/delete")
    public Result<?> delete(@RequestParam(name="id") String id) {
        Result<?> result = new Result<>();
        try {
            actVariableConfigService.delete(id);
            result.success("删除成功！");
        } catch (Exception e) {
            log.error(e.getMessage(),e);
            result.error500("操作失败！" + e.getMessage());
        }
        return result;
    }

    /**
     * 批量删除（逻辑删除）
     * @param ids 多条流程变量ids
     */
    @AutoLog(value = "审批流程变量配置-批量删除")
    @ApiOperation(value="审批流程变量配置-批量删除", notes="审批流程变量配置-批量删除")
    @DeleteMapping(value = "/deleteBatch")
    public Result<?> deleteBatch(@RequestParam(name="ids") String ids) {
        Result<?> result = new Result<>();
        try {
            actVariableConfigService.deleteBatch(ids);
            result.success("批量删除成功！");
        } catch (Exception e) {
            log.error(e.getMessage(),e);
            result.error500("操作失败！" + e.getMessage());
        }
        return result;
    }

    /**
     * 通过id查询
     * @param id 流程变量id
     * @return 流程变量对象
     */
    @ApiOperation(value="审批流程变量配置-通过id查询", notes="审批流程变量配置-通过id查询")
    @GetMapping(value = "/queryById")
    public Result<ActVariableConfig> queryById(@RequestParam(name="id") String id) {
        Result<ActVariableConfig> result = new Result<>();
        try {
            ActVariableConfig actVariableConfig = actVariableConfigService.queryById(id);
            result.setResult(actVariableConfig);
            result.success("查询成功！");
        } catch (Exception e) {
            result.error500("操作失败！" + e.getMessage());
        }
        return result;
    }

    /**
     * 导出excel
     */
    @RequestMapping(value = "/exportXls")
    public ModelAndView exportXls(HttpServletRequest request) {
        // Step.1 组装查询条件
        QueryWrapper<ActVariableConfig> queryWrapper = null;
        LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal();
        try {
            String paramsStr = request.getParameter("paramsStr");
            if (oConvertUtils.isNotEmpty(paramsStr)) {
                String deString = URLDecoder.decode(paramsStr, "UTF-8");
                ActVariableConfig actVariableConfig = JSON.parseObject(deString, ActVariableConfig.class);
                queryWrapper = QueryGenerator.initQueryWrapper(actVariableConfig, request.getParameterMap());
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        // Step.2 AutoPoi 导出Excel
        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
        List<ActVariableConfig> pageList = actVariableConfigService.list(queryWrapper);
        // 导出文件名称
        mv.addObject(NormalExcelConstants.FILE_NAME, "审批流程变量配置列表");
        mv.addObject(NormalExcelConstants.CLASS, ActVariableConfig.class);
        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("审批流程变量配置列表数据",
                "导出人:" + sysUser.getRealname(), "导出信息"));
        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
        return mv;
    }

}
